package cn.itcast.test;


import cn.itcast.domain.Person;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Test;

import java.io.File;
import java.io.FileWriter;
import java.util.*;

public class JacksonDemo {

    // Java对象转为JSON字符串
    @Test
    public void test () throws Exception {
        // 1. 创建Person对象
        Person p = new Person();
        p.setGender("男");
        p.setName("张三");
        p.setAge(23);

        // 2. 创建Jackson的核心对象    ObjectMapper
        ObjectMapper mapper = new ObjectMapper();
        // 3. 转换
        /**
         *
         * 转换方法：
         *      writeValue(参数1, obj):
         *          参数1：
         *              File: 将obj对象转换为json字符串，并保存到指定的文件中
         *              Writer: 将obj对象转换为json字符串，并将json数据填充到字符输出流中
         *              OutputStream: 将obj对象转换为JSON字符串，并将json数据填充到字节输出流中
         *
         *      writeValueAsString(obj)：将对象转为json字符串
         *
         */
        String json = mapper.writeValueAsString(p);
        System.out.println(json); // {"name":"张三","age":23,"gender":"男"}

        // writeValue, 将数据写到f://a.txt文件中
        // mapper.writeValue(new File("f://a.txt"), p);

        // writeValue, 将数据关联到Writer中
        mapper.writeValue(new FileWriter("f://b.txt"), p);
    }

    @Test
    public void test2() throws Exception {
        // 1. 创建Person对象
        Person p = new Person();
        p.setGender("男");
        p.setName("张三");
        p.setAge(23);
        p.setBirthday(new Date());

        // 2. 转换
        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(p);

        System.out.println(json); // {"name":"张三","age":23,"gender":"男","birthday":"201910-21"}
    }

    @Test
    public void test3() throws Exception {
        // 1. 创建Person对象
        Person p = new Person();
        p.setGender("男");
        p.setName("张三");
        p.setAge(23);
        p.setBirthday(new Date());

        Person p1 = new Person();
        p1.setGender("男");
        p1.setName("李四");
        p1.setAge(24);
        p1.setBirthday(new Date());

        Person p2 = new Person();
        p2.setGender("男");
        p2.setName("王麻子");
        p2.setAge(25);
        p2.setBirthday(new Date());

        // 创建List集合
        List<Person> ps = new ArrayList<Person>();
        ps.add(p);
        ps.add(p1);
        ps.add(p2);

        // 2. 转换
        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(ps);

        // [{"name":"张三","age":23,"gender":"男","birthday":"2019-10-21"},{"name":"李四","age":24,"gender":"男","birthday":"2019-10-21"},{"name":"王麻子","age":25,"gender":"男","birthday":"2019-10-21"}]
        System.out.println(json);
    }

    @Test
    public void test4() throws Exception {
       // 1. 创建Person对象
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("name", "赵柳");
        map.put("age", 23);
        map.put("gender", "男");

        // 2. 转换
        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(map);

        // {"age":23,"name":"赵柳","gender":"男"}
        System.out.println(json);
    }

    @Test
    public void test5() throws Exception {
        // 1. 初始化JSON字符串
        String json = "{\"age\":23,\"name\":\"赵柳\",\"gender\":\"男\"}";

        // 2. 创建ObjectMapper对象
        ObjectMapper mapper = new ObjectMapper();
        // 3. 转换为Java对象 Person对象
        Person person = mapper.readValue(json, Person.class);

        System.out.println(person); // Person{name='赵柳', age=23, gender='男'}
    }
}
